import * as vscode from 'vscode';
import { ApiClient } from '../utils/apiClient';

export class GnModificationService {
    private apiClient: ApiClient;

    constructor(apiClient: ApiClient) {
        this.apiClient = apiClient;
    }

    async modifyGnFile(
        editor: vscode.TextEditor,
        action: string,
        token: vscode.CancellationToken
    ): Promise<string> {
        const codeContext = this.buildCodeContext(editor);
        
        // 构建GN修改的提示词
        const prompt = this.buildGnModificationPrompt(codeContext, action);
        
        // 使用LLM生成修改后的GN文件
        const systemPrompt = `你是一个专业的GN构建文件专家，专门为OpenHarmony项目修改GN构建文件。
请遵循以下规范：
1. 保持GN文件的语法正确性
2. 遵循OpenHarmony的构建规范
3. 保持代码的可读性和维护性
4. 添加必要的注释说明
5. 确保构建目标的正确性`;

        return await this.apiClient.generateWithLLM(prompt, systemPrompt);
    }

    private buildCodeContext(editor: vscode.TextEditor): any {
        const document = editor.document;
        const position = editor.selection.active;
        
        return {
            filePath: document.fileName,
            code: document.getText(),
            cursorLine: position.line,
            cursorColumn: position.character,
            language: 'gn',
            projectRoot: this.getProjectRoot(document.uri)
        };
    }

    private buildGnModificationPrompt(codeContext: any, action: string): string {
        const { code, filePath } = codeContext;
        
        let prompt = `请根据以下要求修改GN构建文件：\n\n`;
        prompt += `文件路径: ${filePath}\n\n`;
        prompt += `当前GN文件内容:\n\`\`\`gn\n${code}\n\`\`\`\n\n`;
        
        switch (action) {
            case '添加源文件':
                prompt += `操作要求: 添加新的源文件到构建目标中
请：
1. 识别当前的构建目标
2. 添加新的源文件到sources列表中
3. 保持原有的文件结构
4. 添加适当的注释`;
                break;
                
            case '添加依赖':
                prompt += `操作要求: 添加新的依赖项
请：
1. 识别当前的deps列表
2. 添加新的依赖项
3. 保持依赖项的正确格式
4. 添加适当的注释`;
                break;
                
            case '修改编译选项':
                prompt += `操作要求: 修改编译参数
请：
1. 识别当前的cflags或cflags_c列表
2. 添加或修改编译选项
3. 保持编译选项的正确格式
4. 添加适当的注释`;
                break;
                
            case '添加测试目标':
                prompt += `操作要求: 添加单元测试目标
请：
1. 创建新的test目标
2. 配置测试相关的源文件和依赖
3. 设置正确的测试框架依赖
4. 添加适当的注释`;
                break;
                
            case '添加Fuzz测试目标':
                prompt += `操作要求: 添加Fuzz测试目标
请：
1. 创建新的fuzz_test目标
2. 配置Fuzz测试相关的源文件和依赖
3. 设置libFuzzer相关配置
4. 添加适当的注释`;
                break;
                
            default:
                prompt += `操作要求: ${action}
请根据OpenHarmony的GN构建规范进行相应的修改。`;
        }
        
        prompt += `\n\n请生成修改后的完整GN文件内容，确保：
1. 语法正确
2. 符合OpenHarmony构建规范
3. 保持代码可读性
4. 包含必要的注释`;

        return prompt;
    }

    private getProjectRoot(uri: vscode.Uri): string {
        const workspaceFolder = vscode.workspace.getWorkspaceFolder(uri);
        return workspaceFolder ? workspaceFolder.uri.fsPath : '';
    }
}
